home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2001 May / may_2001.iso / intercd / root / Multimedia / ^DivX_Article / virtualdub / VirtualDub-source-1_4d / DynamicCode.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-03-20  |  1.3 KB  |  52 lines

  1. #if 0
  2.  
  3. #include <windows.h>
  4. #include <stdarg.h>
  5.  
  6. #include "DynamicCode.h"
  7.  
  8. DynamicCode::DynamicCode(const DynamicCodeBlock *pdcb, long *params) : pDynamicBlock(NULL) {
  9.     const long *pReloc = pdcb->entrypts + pdcb->nEntryPoints;
  10.     long *pEntryPoints;
  11.     long nEntryOffset = ((pdcb->nEntryPoints*4+31)&-32);
  12.  
  13.     pDynamicBlock = (void **)VirtualAlloc(NULL, nEntryOffset + pdcb->cbCode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  14.  
  15.     if (pDynamicBlock) {
  16.         int i;
  17.  
  18.         memcpy(pDynamicBlock, pdcb->entrypts, pdcb->nEntryPoints * 4);
  19.  
  20.         pEntryPoints = (long *)pDynamicBlock;
  21.  
  22.         for(i=0; i<pdcb->nEntryPoints; i++)
  23.             *pEntryPoints++ += (long)pDynamicBlock + nEntryOffset;
  24.  
  25.         memcpy((char *)pDynamicBlock + nEntryOffset, pdcb->pCode, pdcb->cbCode);
  26.  
  27.         for(i=0; i<pdcb->nRelocs; i++) {
  28.             long varsrc = *pReloc++, src = varsrc & 0x3fff;
  29.             long *target = (long *)((char *)pDynamicBlock + nEntryOffset + ((unsigned)varsrc>>16));
  30.             int addend = 0, mult = 1;
  31.  
  32.             if (varsrc & 0x8000)
  33.                 addend = *pReloc++;
  34.  
  35.             if (varsrc & 0x4000)
  36.                 mult = *pReloc++;
  37.  
  38.             if (!src)
  39.                 *target += (long)pDynamicBlock + nEntryOffset - (long)pdcb->pCode;
  40.             else
  41.                 *target = params[src-1]*mult + addend;
  42.         }
  43.     }
  44. }
  45.  
  46. DynamicCode::~DynamicCode() {
  47.     if (pDynamicBlock)
  48.         VirtualFree(pDynamicBlock, 0, MEM_RELEASE);
  49. }
  50.  
  51. #endif
  52.